# -*- coding: utf-8 -*-
# @Time     : 2021/4/15 16:35
# @Author   : pengrenjie
# @Email    : 941257162@.com
# @File     : 练习.py



#3、如果在一个函数内部修改全局变量
    #用global定义

#4、如何跨模块共享全局变量
    #创建一个特殊模块（通常称为config或cfg） 创建一个config或者cfg的文件名放入全局变量，使用时再导入模块

#5、python数据类型有哪些
    #Number(int, float, bool, complex), String, List, Tuple, Dictionary, Set

#7、python2与python3 的区别，列出5个
#     1、在Python 2中 print被视为一个语句 而不是一个函数 在Python 3中 被视为函数
#     2、#python2 中的除法运算符为地板除，不是真除。转化成浮点数才表示真除
#        #python3 中的除法就是真除
#     3、Python 2中 默认使用的是 ASICC
#        Python 3中 默认使用的是  utf-8
#     4、python2 有长整型
        #python3 没有长整型，只有整型
#     5、在py3中range()代替了xrange()，xrange()被去掉
      #6、python2中input函数默认输出的值为int类型，python3是字符串
       # 7、python2 True 、False 都没有定义成关键字
       #    python3 True 、False 都是关键字



#8、python中哪些是可变数据类型，哪些是不可变数据类型，为什么
    #可变数据类型：list,dic,set
    #不可变数据类型：Number， String， Tuple
    #1、Python中的不可变数据类型，不允许变量的值发生变化，如果改变了变量的值，相当于是新建了一个对象。而对于相同的值的对象，在内存中则只有一个对象，
        #内部会有一个引用计数来记录有多少个变量引用这个对象。
    #2、Python中的可变数据类型，允许变量的值发生变化，如果对变量进行append、+=等这种操作后，只是改变了变量的值，而不会新建一个对象，变量引用的对象的地址也不会变化。
    #不过对于相同的值的不同对象，在内存中则会存在不同的对象，即每个对象都有自己的地址，相当于内存中对于相同值的对象保存了多份，这里不存在引用计数，是实实在在的对象。


#11、什么是pep8
# 1 缩进。4个空格的缩进（编辑器都可以完成此功能），不使用Tap，更不能混合使用Tap和空格。
#
# 2 每行最大长度79，换行可以使用反斜杠，最好使用圆括号。换行点要在操作符的后边敲回车。
#
# 3 类和top-level函数定义之间空两行；类中的方法定义之间空一行；函数内逻辑无关段落之间空一行；其他地方尽量不要再空行。
#
# 4 模块导入的顺序：按标准、三方和自己编写顺序依次导入，之间空一行。
#
# 5 不要在一句import中多个库，比如import os, sys不推荐
#
# 6避免不必要的空格
#
# 7 注释必须要有
#
# 8 函数命名要遵循规范
#
# 10 尽可能使用‘is’‘is not’取代‘==’，比如if x is not None 要优于if x。
#
# 11 使用基于类的异常，每个模块或包都有自己的异常类，此异常类继承自Exception。
# 12 异常中try的代码尽可能少。

#12、python里如何赋值，深拷贝与浅拷贝的区别
        # Python中，对象的赋值都是进行对象引用（内存地址）传递
        # 浅拷贝：拷贝第一层数据（地址）
        # 深拷贝：递归拷贝所有层的数据（copy.deepcopy)

#13、简述python的内存管理机制
        # 可以从三个方面来讲
        # 引用计数；在python中，每个对象都有存有指向该对象的引用总数，即引用计数（reference count）
        # 每当新的引用指向该对象时，它的引用计数加1；每当该对象的引用失效时引用计数减1
        # 一旦对象的引用计数为0，该对象可以被回收，占用的内存空间可以被释放（不能解决“循环引用”）
        # 垃圾回收：回收原则，当某个对象的引用计数降为0时，可以被垃圾回收
        #     有三种情况触发垃圾回收，调用gc.collect,GC达到阈值时，程序退出时
        #     分代回收：python将所有的对象分为0、1、2 三代，所新建的对象都是0代对象，当某一代对象经历过垃圾回收存活时，就会被归入下一代对象，
        #             如果0代经过一定次数垃圾回收，那么就启动对0代和一代的扫描清理
        #               当1代也经历了一定次数的垃圾回收后，那么会启动对0、1、2代，即对所有对象进行扫描
        #     标记清除：（主要解决循环引用）清楚所有非活动的对象
        # 内存池：内存里开辟了一个整数对象缓冲池[-5,256]可以直接使用

